package com.hatricks.is.algorithm.linkedreversed;

// 定义单向链表节点类
class ListNode {
    int value;          // 节点值
    ListNode next;      // 指向下一个节点

    // 构造函数
    ListNode(int value) {
        this.value = value;
        this.next = null;
    }
}

@SuppressWarnings("ClassEscapesDefinedScope")
public class LinkedListReversal {

    // 反转单向链表方法
    public static ListNode reverseList(ListNode head) {
        ListNode prev = null;   // 前一个节点，初始为 null
        ListNode current = head;  // 当前节点，从头节点开始
        while (current != null) {
            ListNode nextNode = current.next;  // 保存下一个节点的引用
            current.next = prev;  // 反转当前节点的指针，指向前一个节点
            // 移动到下一个节点
            prev = current;  // 更新前一个节点为当前节点
            current = nextNode;  // 更新当前节点为下一个节点
        }
        return prev;  // 返回新的头节点
    }

    // 打印链表方法
    public static void printList(ListNode head) {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.value + " -> ");
            current = current.next;
        }
        System.out.println("null");
    }

    public static void main(String[] args) {
        // 构造单向链表: 1 -> 2 -> 3 -> 4 -> 5 -> null
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);
        System.out.println("原链表:");
        printList(head);

        // 反转链表
        head = reverseList(head);

        System.out.println("反转后的链表:");
        printList(head);
    }
}
